package com.cv.system.service.user;

import com.cv.framework.common.pojo.PageResult;
import com.cv.system.controller.audit.auth.vo.AuditUserLoginProfileRespVO;
import com.cv.system.controller.platform.auth.vo.PlatformUserLoginProfileRespVO;
import com.cv.system.controller.platform.user.vo.PlatformUserPasswordReqVO;
import com.cv.system.controller.platform.user.vo.PlatformUserProfilePasswordReqVO;
import com.cv.system.controller.platform.user.vo.PlatformUserProfileRespVO;
import com.cv.system.controller.platform.user.vo.PlatformUserProfileSaveReqVO;
import com.cv.system.controller.system.auth.vo.UserLoginProfileRespVO;
import com.cv.system.controller.system.user.vo.profile.UserProfilePasswordReqVO;
import com.cv.system.controller.system.user.vo.profile.UserProfileRespVO;
import com.cv.system.controller.system.user.vo.profile.UserProfileSaveReqVO;
import com.cv.system.controller.system.user.vo.user.UserPageReqVO;
import com.cv.system.controller.system.user.vo.user.UserRespVO;
import com.cv.system.controller.system.user.vo.user.UserSaveReqVO;
import com.cv.system.dal.dataobject.user.SystemUsersDO;

import javax.validation.Valid;
import java.util.List;

/**
 * 系统用户业务层接口
 *
 * @author Charles_XDXD
 */
public interface SystemUserService {

    /**
     * 通过用户账号查询用户
     *
     * @param username 用户帐号
     * @return 用户信息
     */
    SystemUsersDO getUserByUsername(String username);

    /**
     * 通过邮箱查询用户
     *
     * @param email 邮箱
     * @return 用户信息
     */
    SystemUsersDO getUserByEmail(String email);

    /**
     * 通过手机号查询用户
     *
     * @param mobile 手机号
     * @return 用户信息
     */
    SystemUsersDO getUserByMobile(String mobile);

    /**
     * 获取用户分页数据
     *
     * @param pageReqVO 分页参数
     */
    PageResult<UserRespVO> getUserPage(UserPageReqVO pageReqVO);

    /**
     * 获取用户详情
     *
     * @param userId 用户编号
     */
    UserRespVO getUserDetail(Long userId);

    /**
     * 获取个人信息
     *
     * @param userId 用户编号
     */
    UserProfileRespVO getUserProfile(Long userId);

    /**
     * 获取个人信息
     *
     * @param userId 用户编号
     */
    PlatformUserProfileRespVO getUserPlatformProfile(Long userId);
    
    /**
     * 获取个人信息
     *
     * @param userId 用户编号
     */
    AuditUserLoginProfileRespVO getUserAuditProfile(Long userId);

    /**
     * 判断密码是否匹配
     *
     * @param rawPassword     未加密的密码
     * @param encodedPassword 加密后的密码
     * @return 是否匹配
     */
    boolean isPasswordMatch(String rawPassword, String encodedPassword);

    /**
     * 创建用户
     *
     * @param userSaveReqVO 用户创建信息
     */
    Long createUser(@Valid UserSaveReqVO userSaveReqVO);

    /**
     * 更新用户
     *
     * @param userSaveReqVO 用户更新信息
     */
    void updateUser(@Valid UserSaveReqVO userSaveReqVO);

    /**
     * 更新用户状态
     *
     * @param userId 用户编号
     * @param status 状态
     */
    void updateUserStatus(Long userId, Integer status);

    /**
     * 修改个人信息
     *
     * @param userId               用户编号
     * @param userProfileSaveReqVO 个人信息
     */
    void updateUserProfile(Long userId, @Valid UserProfileSaveReqVO userProfileSaveReqVO);

    /**
     * 修改视频平台用户信息
     */
    void updateUserProfile(@Valid PlatformUserProfileSaveReqVO platformUserProfileSaveReqVO);

    /**
     * 修改头像
     *
     * @param userId 用户编号
     * @param avatar 头像文件编号
     */
    void updateAvatar(Long userId, Long avatar);

    /**
     * 修改个人密码
     *
     * @param userId                   用户编号
     * @param userProfilePasswordReqVO 密码信息
     */
    void updateUserProfilePassword(Long userId, @Valid UserProfilePasswordReqVO userProfilePasswordReqVO);

    /**
     * 修改密码
     *
     * @param reqVO 修改密码信息
     */
    void modifyUserPassword(@Valid PlatformUserProfilePasswordReqVO reqVO);

    /**
     * 通过用户帐号修改密码
     *
     * @param reqVO 修改密码信息
     */
    void modifyUserPassword(@Valid PlatformUserPasswordReqVO reqVO);

    /**
     * 修改登录用户的邮箱
     */
    void modifyEmail(String email);

    /**
     * 删除用户
     *
     * @param userId 用户编号
     */
    void deleteUser(Long userId);

    /**
     * 更新用户登录信息
     *
     * @param userId 用户编号
     * @param ip     ip 地址
     */
    void updateLoginIpAndTime(Long userId, String ip);

    /**
     * 根据昵称查询用户编号
     *
     * @param nickname 昵称
     * @return 用户编号集合
     */
    List<Long> queryUserIdsByNickname(String nickname);

    /**
     * 通过用户编号获取昵称
     *
     * @param userId 用户编号
     * @return 昵称
     */
    String queryNicknameByUserId(Long userId);

    /**
     * 获得登录用户基本信息
     *
     * @param userId 用户编号
     * @return 登录用户基本信息
     */
    UserLoginProfileRespVO getLoginUserProfile(Long userId);

    /**
     * 获得登录用户基本信息 - 视频平台
     *
     * @param userId 用户编号
     * @return 登录用户基本信息
     */
    PlatformUserLoginProfileRespVO getLoginUserPlatformProfile(Long userId);

}
